なぜJavaScriptのfetchはawaitを2回しないとレスポンスを取れないのか | maguro​.dev
なぜJavaScriptのfetchはawaitを2回しないとレスポンスを取れないのか | maguro​.dev
fetchが2回awaitを必要とする理由の整理
code:js
// 1回目の await: レスポンスヘッダが届くまで待つ
const resp = await fetch("https://api.example.com/users");
// この時点でヘッダにはアクセスできる
console.log(resp.status);
console.log(resp.headers.get("Content-Type"));
// 2回目の await: レスポンスボディを読み取る
const users = await resp.json();
code:js
// 仮想的なAPI: 1回のawaitでボディまで取得
const { headers, body } = await fetch("https://api.example.com/users");
HTTPレスポンスヘッダー、レスポンスボディの分離設計
巨大なレスポンスへの対応としてのストリーミング処理
SSE、ストリーミングレスポンスにおける未完了ボディ問題の回避
axios、ky、gotなど他HTTPクライアントとの設計比較
Rust、Python、Goに見られる同様のヘッダ先行モデル
https://github.com/seanmonstar/reqwest
https://docs.aiohttp.org/en/stable/
fetchでのレスポンスボディ未消費時のGC依存
Node.js・undiciでは非推奨
Deno
Resource sanitizerによるリソースリーク検知
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Resource_management
Explicit Resource Managementとfetch統合への議論状況